# 导入库
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfpage import PDFTextExtractionNotAllowed
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.pdfdevice import PDFDevice
from pdfminer.layout import *
from pdfminer.converter import PDFPageAggregator
'''
模块名	                            说明
PDFParser	                从文件中获取数据
PDFDocument	            存储文档数据结构到内存中
PDFPageInterpreter	            解析page内容
PDFDevice	            把解析到的内容转化为你需要的东西
PDFResourceManager	    存储共享资源，例如字体或图片等
'''
# 设置文档密码
# password = '1'
# #打开pdf文件
# fp = open('book.pdf','rb')
# #从文件句柄创建一个pdf解析对象
# parser = PDFParser(fp)
# #创建pdf文档对象，存储文档结构
# document = PDFDocument(parser,password)
# #创建一个pdf资源管理对象，存储共享资源
# rsrcmgr = PDFResourceManager()
# #创建一个device对象
# device = PDFDevice(rsrcmgr)
# #创建一个解释对象
# interpreter = PDFPageInterpreter(rsrcmgr, device)
# #处理包含在文档中的每一页
# for page in PDFPage.create_pages(document):
#     interpreter.process_page(page)


# todo  解析对象
'''
对象名	        对象说明	                                                                备注
LTPage	        代表一个完整的页面，可以包含子对象	                                例如：LTTextBox,LTFigure,LTImage,LTRect,LTCurve和LTLine
LTTextBox	    它包含 LTTextLine 对象的列表，代表一组被包含在矩形区域中的文本	    注意：该box是根据几何学分析得到的，并不一定准确地表现为该文本的逻辑范围，get_text()方法可以返回文本内容
LTTextLine	    包含一个LTChar对象的列表，表现为单行文本	                        字符表现为一行或一列，取决于文本书写方式，get_text()方法返回文本内容
LTChar	        表示一个在文本中的真实的字母，作为一个unicode字符串	                LTChar 对象有真实的分隔符
LTAnno	        表示一个在文本中的真实的字母，作为一个unicode字符串	                LTAnno 对象没有，是虚拟分隔符，按照两个字符之间的关系，布局分析器插入虚拟分隔符
LTFigure	    表示一个被 PDF Form 对象使用的区域	                                pdf form适用于目前的图表(present figures)或者页面中植入的另一个pdf文档图片，LTFigure对象可以递归
LTImage	        表示一个图形对象，可以是JPEG或者其他格式	                        但 PDFMiner 目前没有花太多精力在图形对象上
LTLine	        表示一根直线	                                                    用来分割文本或图表(figures)
LTRect	        表示一个矩形	                                                    用来框住别的图片或者图表
LTCurve	        代表一个贝塞尔曲线
'''
# 提供初始密码
password = ''
# 没有密码可以初始密码
# document.initialize()
#打开pdf文件
fp = open('book.pdf','rb')
#从文件句柄创建一个pdf解析对象
parser = PDFParser(fp)
#创建pdf文档对象，存储文档结构
document = PDFDocument(parser, password)
#创建一个pdf资源管理对象，存储共享资源
rsrcmgr = PDFResourceManager()
laparams = LAParams()
#创建一个device对象
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
#创建一个解释对象
interpreter = PDFPageInterpreter(rsrcmgr, device)
#处理包含在文档中的每一页
for page in PDFPage.create_pages(document):
    interpreter.process_page(page)
    layout = device.get_result()
    for x in layout:
        # 获取文本对象
        if isinstance(x, LTTextBox):
            print(x.get_text().strip())
        # 获取图片对象
        if isinstance(x,LTImage):
            print('这里获取到一张图片')
        # 获取 figure 对象
        if isinstance(x,LTFigure):
            print('这里获取到一个 figure 对象')

# 参考：https://euske.github.io/pdfminer/